from google.appengine.api import users
from modelo import Tarea
from modelo import Proyecto
import webapp2
import datetime
import jinja2
import os
from sys import maxint
from cgi import escape

class BaseHandler(webapp2.RequestHandler):
    
    @classmethod
    def string_to_int(cls, s, i_min, i_max, default = 0):
        '''
        Convierte una cadena con la representacion de un entero a un entero
        que debe estar comprendido entre el minimo y el maximo (inclusive).
        Si hay un error, se devuelve el valor por defecto.
        '''
        try:
            i = int(s)
            if i >= i_min and i <= i_max:
                return i
            else:
                return default
        except:
            return default
    
    @classmethod
    def string_to_date(cls, string_date):
        '''
        Convierte una fecha con formato dia-mes-anyo a un Date, y devuelve
        None en caso de error.
        '''
        try:
            return datetime.datetime.strptime(string_date, '%Y-%m-%d').date()
        except:
            return None
        
    @classmethod
    def string_to_time(cls, string_time):
        try:
            return datetime.datetime.strptime(string_time, '%H:%M').time()
        except:
            return None
        
    @classmethod
    def render(cls, template, **params):
        '''
        Renderiza los templates con los parametros que se le pasen un un
        diccionario y devuelve la cadena de texto.
        '''
        #return os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'templates'))
        return jinja2.Environment(loader = jinja2.FileSystemLoader(os.path.dirname(__file__)), autoescape = False).get_template(template).render(params)


class MainPage(BaseHandler):
    def get(self):
        u = users.get_current_user()
        if u:
            u = u.nickname()
        self.response.out.write(self.render('listar.html', **{'link_cierre' : users.create_logout_url(self.request.uri),
                                                              'usuario' : u,
                                                              'link_inicio' : users.create_login_url('/'),
                                                              'proyectos' : Proyecto.listar(users.get_current_user()),
                                                              'tareas' : Tarea.listar(users.get_current_user())}))    
            
class NuevaTarea(BaseHandler):
    def post(self):
        n = escape(self.request.get('t_nombre'), True)
        d = escape(self.request.get('t_descripcion'), True)
        p = self.string_to_int(self.request.get('t_proyecto'), -1, maxint, -1)
        f = self.string_to_date(self.request.get('t_fecha'))
        i = self.string_to_int(self.request.get('t_prioridad'), 1, 3, 2)
        c = self.string_to_int(self.request.get('t_correo'), 0, 1, 0)
        a = self.string_to_time(self.request.get('t_hora'))
        e = self.string_to_int(self.request.get('t_estado'), 1, 5, 1)
        Tarea.nueva(users.get_current_user(), n, d, p, f, c, a, i, e)
        self.redirect('/')
        
class NuevoProyecto(BaseHandler):
    def post(self):
        nombre = escape(self.request.get('p_nombre'), True)
        descripcion = escape(self.request.get('p_descripcion'), True)
        Proyecto.nuevo(nombre, descripcion)
        self.redirect('/')

class ModificarTarea(BaseHandler):
    def post(self):
        t_id = self.string_to_int(self.request.get('et_id'), 0, maxint, -1)
        n = escape(self.request.get('et_nombre'), True)
        d = escape(self.request.get('et_descripcion'), True)
        p = self.string_to_int(self.request.get('et_proyecto'), -1, maxint, -1)
        f = self.string_to_date(self.request.get('et_fecha'))
        i = self.string_to_int(self.request.get('et_prioridad'), 1, 3, 2)
        c = self.string_to_int(self.request.get('et_correo'), 0, 1, 0)
        a = self.string_to_time(self.request.get('et_hora'))
        e = self.string_to_int(self.request.get('et_estado'), 1, 5, 1)
        if self.request.get('modificar'):
            Tarea.modificar(users.get_current_user(), t_id, n, d, p, f, c, a, i, e)
        if self.request.get('borrar'):
            Tarea.borrar(users.get_current_user(), t_id)
        self.redirect('/')

class ModificarProyecto(BaseHandler):
    def post(self):
        nombre = escape(self.request.get('ep_nombre'), True)
        descripcion = escape(self.request.get('ep_descripcion'), True)
        mostrar = self.string_to_int(self.request.get('ep_mostrar'), 0, 1, 1)
        p_id = self.string_to_int(self.request.get('ep_id'), 0, maxint, -1)
        if self.request.get('modificar'):
            Proyecto.modificar(users.get_current_user(), p_id, nombre, descripcion, mostrar)
        if self.request.get('borrar'):
            Proyecto.borrar(users.get_current_user(), p_id)
        self.redirect('/')

class ListarXML(BaseHandler):
    def get(self):
        u = users.get_current_user()
        if u:
            self.response.headers['Content-Type'] = "application/xml"
            self.response.out.write(self.render('datos.xml', **{'proyectos' : Proyecto.listar(u),
                                                                'tareas' : Tarea.listar(u)}))

class ModOptions(BaseHandler):
    pass
    '''def post(self):
        if self.request.get('ocultar'):'''
            
            
    
app = webapp2.WSGIApplication([('/', MainPage),
                               ('/newtask', NuevaTarea),
                               ('/newproject', NuevoProyecto),
                               ('/modtask', ModificarTarea),
                               ('/modproject', ModificarProyecto),
                               ('/listxml', ListarXML),
                               ('/modoptions', ModOptions)
                               ], debug=True)
